﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class WorkflowConfigData
    {
        #region Variaveis Membro
        private int _idWfConfigData;
        private WorkflowConfig _wfConfig;
        private int _dia;
        private string _tipoDia;
        private TipoPagamento _tipoPagamento;
        private TipoPeriodicidade _tipoPeriodicidade;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdWfConfigData
        {
            get { return _idWfConfigData; }
            set { _idWfConfigData = value; }
        }
        public WorkflowConfig WfConfig
        {
            get { return _wfConfig; }
            set { _wfConfig = value; }
        }
        public int Dia
        {
            get { return _dia; }
            set { _dia = value; }
        }
        public string TipoDia
        {
            get { return _tipoDia; }
            set { _tipoDia = value; }
        }
        public TipoPagamento TipoPagamento
        {
            get { return _tipoPagamento; }
            set { _tipoPagamento = value; }
        }

        public TipoPeriodicidade TipoPeriodicidade
        {
            get { return _tipoPeriodicidade; }
            set { _tipoPeriodicidade = value; }
        }
        #endregion

        #region Construtores
        public WorkflowConfigData()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public WorkflowConfigData(int idWfData)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idWfData);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idWfData)
        {
            try
            {
                var consulta = from cwd in _context.tab_configuracao_data_workflow
                               where cwd.id_dt_configuracao_workflow == idWfData
                               select new
                               {
                                   cwd.id_dt_configuracao_workflow,
                                   cwd.tab_configuracao_workflow.id_configuracao_workflow,
                                   cwd.dia,
                                   cwd.tipo_dia,
                                   cwd.tab_tipo_pagamento.id_tipo_pagamento
                               };
                
                var listConsulta = consulta.ToList();


                foreach (var list in listConsulta)
                {
                    this._idWfConfigData = list.id_dt_configuracao_workflow;
                    this._wfConfig = new WorkflowConfig(list.id_configuracao_workflow);
                    this._dia = list.dia;
                    this._tipoDia = list.tipo_dia;
                    this._tipoPagamento = new TipoPagamento(list.id_tipo_pagamento);

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodo Publicos

        #region Metodos de Selecao
        public List<WorkflowConfigData> SelectAll()
        {
            try
            {
                List<WorkflowConfigData> listWfConfigData = new List<WorkflowConfigData>();

                var consulta = from cwd in _context.tab_configuracao_data_workflow
                               select new
                               {
                                   cwd.id_dt_configuracao_workflow,
                                   cwd.tab_configuracao_workflow.id_configuracao_workflow,
                                   cwd.dia,
                                   cwd.tipo_dia,
                                   cwd.tab_tipo_pagamento.id_tipo_pagamento
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfigData wfConfigData = new WorkflowConfigData();
                    wfConfigData.IdWfConfigData = list.id_dt_configuracao_workflow;
                    wfConfigData.WfConfig = new WorkflowConfig(list.id_configuracao_workflow);
                    wfConfigData.Dia = list.dia;
                    wfConfigData.TipoDia = list.tipo_dia;
                    wfConfigData.TipoPagamento = new TipoPagamento(list.id_tipo_pagamento);

                    listWfConfigData.Add(wfConfigData);
                }

                return listWfConfigData;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<WorkflowConfigData> SelectPor(int idWfConfig)
        {
            try
            {
                List<WorkflowConfigData> listWfConfigData = new List<WorkflowConfigData>();

                var consulta = from cwd in _context.tab_configuracao_data_workflow
                               where cwd.tab_configuracao_workflow.id_configuracao_workflow == idWfConfig
                               select new
                               {
                                   cwd.id_dt_configuracao_workflow,
                                   cwd.tab_configuracao_workflow.id_configuracao_workflow,
                                   cwd.dia,
                                   cwd.tipo_dia,
                                   cwd.tab_tipo_pagamento.id_tipo_pagamento,
                                   cwd.tab_tipo_periodicidade.id_tipo_periodicidade
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfigData wfConfigData = new WorkflowConfigData();
                    wfConfigData.IdWfConfigData = list.id_dt_configuracao_workflow;
                    wfConfigData.WfConfig = new WorkflowConfig(list.id_configuracao_workflow);
                    wfConfigData.Dia = list.dia;
                    wfConfigData.TipoDia = list.tipo_dia;
                    wfConfigData.TipoPagamento = new TipoPagamento(list.id_tipo_pagamento);
                    wfConfigData.TipoPeriodicidade = new TipoPeriodicidade(list.id_tipo_periodicidade);

                    listWfConfigData.Add(wfConfigData);
                }

                return listWfConfigData;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<WorkflowConfigData> BuscarPeriodicidade(int idTipoBeneficio, int idContrato, int idLocalidade)
        {
            try
            {
                List<WorkflowConfigData> listWfConfigData = new List<WorkflowConfigData>();

                ProcessoContrato processoContrato = new ProcessoContrato();
                List<ProcessoContrato> listProcessoContrato = processoContrato.BuscarProcessoBeneficio(idTipoBeneficio, idContrato, idLocalidade, false);

                TipoBeneficio tipoBeneficio = new TipoBeneficio();
                int idTipoDocumento = tipoBeneficio.RetornaTipoDocumento(idTipoBeneficio);

                WorkflowConfig WfConfig = new WorkflowConfig();
                List<WorkflowConfig> listWfConfig = WfConfig.SelectPor(idTipoDocumento, idContrato, listProcessoContrato[0].IdProcessoContrato, 1);

                int idWfConfig = listWfConfig[0].IdWfConfig;

                var consulta = (from cwd in _context.tab_configuracao_data_workflow
                                where cwd.tab_configuracao_workflow.id_configuracao_workflow == idWfConfig
                                select new
                                {
                                    cwd.id_dt_configuracao_workflow,
                                    cwd.tab_tipo_periodicidade.id_tipo_periodicidade
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    WorkflowConfigData WfConfigData = new WorkflowConfigData();
                    WfConfigData.IdWfConfigData = list.id_dt_configuracao_workflow;
                    WfConfigData.TipoPeriodicidade = new TipoPeriodicidade(list.id_tipo_periodicidade);

                    listWfConfigData.Add(WfConfigData);
                }

                return listWfConfigData;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try
            {
                if (this._idWfConfigData == 0)
                {
                    tab_configuracao_data_workflow tabWfDt = new tab_configuracao_data_workflow();
                    tabWfDt.tab_configuracao_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_workflow", "id_configuracao_workflow", this.WfConfig.IdWfConfig);
                    tabWfDt.dia = this.Dia;
                    tabWfDt.tipo_dia = this.TipoDia;
                    tabWfDt.tab_tipo_pagamentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_pagamento", "id_tipo_pagamento", this.TipoPagamento.IdTipoPagamento);
                    tabWfDt.tab_tipo_periodicidadeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_periodicidade", "id_tipo_periodicidade", this.TipoPeriodicidade.IdTipoPeriodicidade);

                    _context.AddTotab_configuracao_data_workflow(tabWfDt);
                    _context.SaveChanges();
                }
                else
                {
                    tab_configuracao_data_workflow tabWfDt = (from wfdt in _context.tab_configuracao_data_workflow
                                                              where wfdt.id_dt_configuracao_workflow == this.IdWfConfigData
                                                              select wfdt).First();

                    tabWfDt.tab_configuracao_workflowReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_configuracao_workflow", "id_configuracao_workflow", this.WfConfig.IdWfConfig);
                    tabWfDt.dia = this.Dia;
                    tabWfDt.tipo_dia = this.TipoDia;
                    tabWfDt.tab_tipo_pagamentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_pagamento", "id_tipo_pagamento", this.TipoPagamento.IdTipoPagamento);
                    tabWfDt.tab_tipo_periodicidadeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_periodicidade", "id_tipo_periodicidade", this.TipoPeriodicidade.IdTipoPeriodicidade);

                    _context.SaveChanges();
                    
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion




    }
}
